package view.controle;

import java.io.IOException;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import model.bo.EmpregadoBO;
import model.bo.EmpregadoException;
import model.entidade.Empregado;


public class EmpregadoServlet extends BaseServlet {
	
	private static final long serialVersionUID = 1L;

	public EmpregadoServlet() {
		super();
	}
	
	/**
	 * Método executado antes de apresentar a tela de inclusão do empregado.
	 * 
	 * @param request
	 * @param response
	 * @throws ServletException
	 * @throws IOException
	 * @author Zeno
	 */
	protected void antesIncluir(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

                RequestDispatcher rd = null;
                
		try {
			rd = request.getRequestDispatcher("incluir.jsp");
			rd.forward(request, response);
		} 
		catch (Exception e) {
                        request.setAttribute("mensagem", "Erro na ação anterior a inclusão de empregado.");
                        request.setAttribute("detalhe", e.getMessage());
                        rd = request.getRequestDispatcher("../erro.jsp");
			rd.forward(request, response);
		}

	}

	/**
	 * Método executado ao submeter o formulário da tela de inclusão do empregado.
	 * 
	 * @param request
	 * @param response
	 * @throws ServletException
	 * @throws IOException
	 * @author Zeno
	 */
	protected void incluir(HttpServletRequest request, HttpServletResponse response) throws Exception, EmpregadoException {
		
		RequestDispatcher rd = null;
            
                String mensagem = null;
                String mensagemErro = null;
		
		try {
			
			Empregado empregado = new Empregado();
			empregado.setNome(request.getParameter("nome"));
			empregado.setSexoPorExtenso(request.getParameter("sexo"));
                        empregado.setSalarioPorExtenso(request.getParameter("salario"));
			empregado.setCpf(request.getParameter("cpf"));
			empregado.setDataNascimento(request.getParameter("dataNascimento"));
			empregado.setDataAdmissao(request.getParameter("dataAdmissao"));
			empregado.setDataDesligamento(request.getParameter("dataDesligamento"));
                        
                        try {
                            EmpregadoBO.getInstance().incluiEmpregado(empregado);
                            mensagem = "Empregado cadastrado com sucesso!";
                            request.setAttribute("mensagem", mensagem);
                        }
                        catch (EmpregadoException e) {
                            mensagemErro = e.getMessage();
                            request.setAttribute("mensagemErro", mensagemErro);
                        }
			
			rd = request.getRequestDispatcher("incluir.jsp");
			rd.forward(request, response);
			
		} 
		catch (Exception e) {
                        request.setAttribute("mensagem", "Erro na ação de incluir empregado.");
                        request.setAttribute("detalhe", e.getMessage());
                        rd = request.getRequestDispatcher("../erro.jsp");
			rd.forward(request, response);
		}
	}
	
	/**
	 * Método executado ao selecionar a edição de um empregado na tela de listagem de empregados.
	 * 
	 * @param request
	 * @param response
	 * @throws IOException
	 * @author Zeno
	 */
	protected void antesAlterar(HttpServletRequest request, HttpServletResponse response) throws Exception {
		
                RequestDispatcher rd = null;
            
                try {
			String id = request.getParameter("id");
			request.setAttribute("id", id);
			
			Empregado empregado = EmpregadoBO.getInstance().consultar(Long.valueOf(id));
			request.setAttribute("empregado", empregado);

			rd = request.getRequestDispatcher("editar.jsp");
			rd.forward(request, response);
			
		} catch (Exception e) {
                        request.setAttribute("mensagem", "Erro na ação anterior a alteração de empregado.");
                        request.setAttribute("detalhe", e.getMessage());
                        rd = request.getRequestDispatcher("../erro.jsp");
			rd.forward(request, response);
		}
		
	}

	/**
	 * Método executado ao submeter o formulário da tela de edição do empregado.
	 * 
	 * @param request
	 * @param response
	 * @throws IOException
	 * @author Zeno
	 */
	protected void alterar(HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		RequestDispatcher rd = null;
                String mensagem = null;
                String mensagemErro = null;
		
		try {
			
			String id = request.getParameter("id");
			Empregado antigoEmpregado = EmpregadoBO.getInstance().consultar(Long.valueOf(id));
			
			Empregado novoEmpregado = new Empregado();
			novoEmpregado.setNome(request.getParameter("nome"));
			novoEmpregado.setSexoPorExtenso(request.getParameter("sexo"));
                        novoEmpregado.setSalarioPorExtenso(request.getParameter("salario"));
			novoEmpregado.setCpf(request.getParameter("cpf"));
			novoEmpregado.setDataNascimento(request.getParameter("dataNascimento"));
			novoEmpregado.setDataAdmissao(request.getParameter("dataAdmissao"));
			novoEmpregado.setDataDesligamento(request.getParameter("dataDesligamento"));
			
                        try {
                            EmpregadoBO.getInstance().alteraEmpregado(antigoEmpregado, novoEmpregado);
                            mensagem = "Alteração feita com sucesso!";
                            request.setAttribute("mensagem", mensagem);
                            request.setAttribute("empregado", novoEmpregado);
                        }
                        catch (EmpregadoException e) {
                            mensagemErro = e.getMessage();
                            request.setAttribute("mensagemErro", mensagemErro);
                            request.setAttribute("empregado", antigoEmpregado);
                        }
			
                        request.setAttribute("id", id);
                        
			rd = request.getRequestDispatcher("editar.jsp");
			rd.forward(request, response);
			
		} 
		catch (Exception e) {
			request.setAttribute("mensagem", "Erro na ação de alterar empregado.");
                        request.setAttribute("detalhe", e.getMessage());
                        rd = request.getRequestDispatcher("../erro.jsp");
			rd.forward(request, response);
		}
		
	}
	
	/**
	 * Método executado ao selecionar a exclusão de um empregado na tela de listagem de empregados.
	 * 
	 * @param request
	 * @param response
	 * @throws IOException
	 * @author Zeno
	 */
	protected void excluir(HttpServletRequest request, HttpServletResponse response) throws Exception {
		
                RequestDispatcher rd = null;
            
		try {
			
			String id = request.getParameter("id");
			Empregado empregado = EmpregadoBO.getInstance().consultar(Long.valueOf(id));
			
			EmpregadoBO.getInstance().excluir(empregado);
			
			String mensagemExclusao = "Empregado excluído com sucesso!";
			request.setAttribute("mensagemExclusao", mensagemExclusao);
			
			rd = request.getRequestDispatcher("listar.jsp");
			rd.forward(request, response);
			
		} catch (Exception e) {
			request.setAttribute("mensagem", "Erro na ação de excluir empregado.");
                        request.setAttribute("detalhe", e.getMessage());
                        rd = request.getRequestDispatcher("../erro.jsp");
			rd.forward(request, response);
		}
		
	}
	
	/**
	 * Método executado para listar todos os empregados cadastrados.
	 * 
	 * @param request
	 * @param response
	 * @throws ServletException
	 * @throws IOException
	 * @author Zeno
	 */
	protected void listar(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		RequestDispatcher rd = null;
                String mensagem = null;
		
		try {
			List<Empregado> listaEmpregados = EmpregadoBO.getInstance().listar();
			request.setAttribute("listaEmpregados", listaEmpregados);
			
			if (listaEmpregados.isEmpty()) {
				mensagem = "Nenhum empregado cadastrado.";
				request.setAttribute("mensagem", mensagem);
			}
			
			rd = request.getRequestDispatcher("listar.jsp");
			rd.forward(request, response);

		} catch (Exception e) {
			request.setAttribute("mensagem", "Erro na ação de listar empregados.");
                        request.setAttribute("detalhe", e.getMessage());
                        rd = request.getRequestDispatcher("../erro.jsp");
			rd.forward(request, response);
		}
	}
	
	/**
	 * Método executado para apresentar a tela de consulta do empregado.
	 * 
	 * @param request
	 * @param response
	 * @throws ServletException
	 * @throws IOException
	 * @author Zeno
	 */
	protected void antesConsultar(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

                RequestDispatcher rd = null;
            
		try {
			rd = request.getRequestDispatcher("consultar.jsp");
			rd.forward(request, response);
		} 
		catch (Exception e) {
			request.setAttribute("mensagem", "Erro na ação anterior a consulta de empregados.");
                        request.setAttribute("detalhe", e.getMessage());
                        rd = request.getRequestDispatcher("../erro.jsp");
			rd.forward(request, response);
		}

	}

	/**
	 * Método executado ao submeter o formulário da tela de consulta do empregado.
	 * Se o empregado buscado estiver na lista, redireciona para a listagem com os empregados semelhantes. 
	 * 
	 * @param request
	 * @param response
	 * @throws ServletException
	 * @throws IOException
	 * @author Zeno
	 */
	protected void consultar(HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		RequestDispatcher rd = null;
                String mensagem = null;
		
		try {
			
			Empregado empregado = new Empregado();
			empregado.setNome(request.getParameter("nome"));
			empregado.setSexoPorExtenso(request.getParameter("sexo"));
			empregado.setSalarioPorExtenso(request.getParameter("salario"));
			empregado.setCpf(request.getParameter("cpf"));
			empregado.setDataNascimento(request.getParameter("dataNascimento"));
			empregado.setDataAdmissao(request.getParameter("dataAdmissao"));
			empregado.setDataDesligamento(request.getParameter("dataDesligamento"));
			
			List<Empregado> listaEmpregadosConsultados = EmpregadoBO.getInstance().consultaEmpregado(empregado);
			
			if (!listaEmpregadosConsultados.isEmpty()) {
				request.setAttribute("listaEmpregados", listaEmpregadosConsultados);
				rd = request.getRequestDispatcher("listar.jsp");
			}
			else {
				mensagem = "Empregado não encontrado. Tente novamente.";
				request.setAttribute("mensagem", mensagem);
				
				rd = request.getRequestDispatcher("consultar.jsp");
			}
			
			rd.forward(request, response);
			
		} catch (Exception e) {
			request.setAttribute("mensagem", "Erro na ação de consultar empregados.");
                        request.setAttribute("detalhe", e.getMessage());
                        rd = request.getRequestDispatcher("../erro.jsp");
			rd.forward(request, response);
		}
		
	}
}
